package com.pc.admin.controller;

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.pc.admin.dto.UserDTO;
import com.pc.admin.service.UserService;
import com.pc.admin.util.BaseJsonParam;
import com.pc.admin.util.BaseResultEntity;
import com.pc.admin.util.CommonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;

/**
 * 登录测试
 * @author ZHANGJING
 * @date 2023/7/4 11:57
 */

@Slf4j
@RestController
@RequestMapping("/user")
@CrossOrigin
@Api(tags = "用户登录")
public class UserController {

    @Autowired
    private UserService userService;


    @ApiOperation(value = "登录", notes = "登录")
    @PostMapping("/login")
    public CommonResult login(@Validated @RequestBody BaseJsonParam<UserDTO> param) {
        userService.login(param.getParam());
        return CommonResult.ok();
    }

    @ApiOperation(value = "手机号码发送验证码", notes = "手机号码发送验证码")
    @GetMapping("/sendMsg")
    public CommonResult sendMsg(String phone) throws Exception {
        if (StringUtils.isEmpty(phone)) {
            return CommonResult.fail("缺少参数");
        }
        Integer code = userService.sendMsg(phone);
        return CommonResult.ok(code, "发送验证码成功");
    }


    @ApiOperation(value = "退出登录", notes = "退出登录")
    @PostMapping("/logout")
    public CommonResult<String> logInout(HttpSession httpSession) {
        try {
            userService.logout(httpSession);
            return CommonResult.ok("退出成功了");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return CommonResult.fail("退出失败了");
    }


    /**
     * 测试登录，浏览器访问： http://localhost:8006/user/doLogin?username=zhang&password=123456
     *
     * @param username
     * @param password
     * @return
     */
    @RequestMapping("doLogin")
    public SaResult doLogin(String username, String password) {
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对
        // 第一步：比对前端提交的账号名称、密码
        if ("zhang".equals(username) && "123456".equals(password)) {
            // 第二步：根据账号id，进行登录
            StpUtil.login(10001);//StpUtil.login(10001) 方法利用了 Cookie 自动注入的特性，省略了你写返回 token 的代码
            SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
            return SaResult.ok("登录成功"+ tokenInfo);
        }
        //Sa-Token 为这个账号创建了一个Token凭证，且通过 Cookie 上下文返回给了前端。
        return SaResult.error("登录失败");
    }

    /**
     * 查询登录状态，浏览器访问： http://localhost:8006/user/isLogin
     * @return
     */
    @RequestMapping("isLogin")
    public SaResult isLogin() {
        return SaResult.ok("当前会话是否登录：" + StpUtil.isLogin());
    }

    /**
     *  检验当前会话是否已经登录, 如果未登录，则抛出异常：`NotLoginException：未能读取到有效 token`，登录认证，登录之后才可以进入方法
     *  浏览器访问： http://localhost:8006/user/checkLogin
     * @return
     */
    @RequestMapping("checkLogin")
    public SaResult checkLogin() {
        StpUtil.checkLogin();
        return SaResult.ok();
    }



    /**
     * 注销登录，浏览器访问： http://localhost:8006/user/logout
     * @return
     */
    @RequestMapping("logout")
    public SaResult logout() {
        StpUtil.logout();
        return SaResult.ok();
    }



}
